From: Jasper St. Pierre Date: Mon, 8 Jul 2013 19:19:34 +0000 (-0400) Subject: popupMenu: Add a simple way to get the toplevel for a submenu / section X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~3946 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=c1e2d66abdb98962b903c413cbe5c490de2a47fd;p=gnome-shell.git popupMenu: Add a simple way to get the toplevel for a submenu / section This will be used to avoid some nasty signal propagation when wanting to rework how sections / submenus work. https://bugzilla.gnome.org/show_bug.cgi?id=702539 --- diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js index 4b9eb4008..b0d219f5a 100644 --- a/js/ui/popupMenu.js +++ b/js/ui/popupMenu.js @@ -672,6 +672,7 @@ const PopupMenuBase = new Lang.Class({ _init: function(sourceActor, styleClass) { this.sourceActor = sourceActor; + this._parent = null; if (styleClass !== undefined) { this.box = new St.BoxLayout({ style_class: styleClass, @@ -694,6 +695,13 @@ const PopupMenuBase = new Lang.Class({ this._sessionUpdatedId = Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated)); }, + _getTopMenu: function() { + if (this._parent) + return this._parent._getTopMenu(); + else + return this; + }, + _sessionUpdated: function() { this._setSettingsVisibility(Main.sessionMode.allowSettings); }, @@ -903,6 +911,8 @@ const PopupMenuBase = new Lang.Class({ else throw TypeError("Invalid argument to PopupMenuBase.addMenuItem()"); + menuItem._parent = this; + this.length++; }, @@ -1154,18 +1164,6 @@ const PopupSubMenu = new Lang.Class({ this.actor.hide(); }, - _getTopMenu: function() { - let actor = this.actor.get_parent(); - while (actor) { - if (actor._delegate && actor._delegate instanceof PopupMenu) - return actor._delegate; - - actor = actor.get_parent(); - } - - return null; - }, - _needsScrollbar: function() { let topMenu = this._getTopMenu(); let [topMinHeight, topNaturalHeight] = topMenu.actor.get_preferred_height(-1);